#!/bin/bash
# Docker CE 安装脚本
# 功能：安装 Docker CE，配置镜像加速，验证安装

set -Eeuo pipefail

# 日志函数
log() { echo -e "$(date +'%F %T') | $*"; }
warn() { echo -e "$(date +'%F %T') | WARNING: $*" >&2; }
err() { echo -e "$(date +'%F %T') | ERROR: $*" >&2; }
trap 'err "脚本出错（行号: $LINENO）"' ERR

log "=========================================="
log "Docker CE 安装开始"
log "=========================================="

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then 
    err "请使用 root 用户运行此脚本"
    exit 1
fi

# 1. 卸载旧版本 Docker（如果存在）
log "[1/5] 卸载旧版本 Docker..."
yum remove -y docker docker-client docker-client-latest docker-common \
    docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true
log "✓ 旧版本 Docker 已清理"

# 2. 添加 Docker 仓库（使用阿里云镜像）
log "[2/5] 添加 Docker 仓库（阿里云镜像）..."
# 使用阿里云 Docker 仓库镜像
cat > /etc/yum.repos.d/docker-ce.repo <<'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF

# 先清理并刷新 yum 元数据，避免镜像元数据异常
yum --enablerepo=docker-ce-stable clean metadata || true
yum makecache fast
log "✓ Docker 仓库已添加"

# 3. 安装 Docker CE（包含 buildx 插件）
log "[3/5] 安装 Docker CE..."
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin

# docker-compose-plugin 在部分镜像源上可能缺失，这里做降级处理
if yum list docker-compose-plugin >/dev/null 2>&1; then
    if yum install -y docker-compose-plugin; then
        log "✓ docker-compose-plugin 安装完成"
    else
        warn "docker-compose-plugin 安装失败，继续后续步骤（可选在宿主机上单独安装 Compose）"
    fi
else
    warn "当前镜像源未找到 docker-compose-plugin 包，跳过安装（可选在宿主机上单独安装 Compose）"
fi

log "✓ Docker CE 安装步骤完成（核心组件已安装）"

# 4. 配置 Docker
log "[4/5] 配置 Docker..."

# 创建 Docker 配置目录
mkdir -p /etc/docker

# 配置 Docker 镜像加速（使用阿里云镜像）
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# 启动 Docker 并设置开机自启
systemctl daemon-reload
systemctl enable docker

log "✓ Docker 配置文件已创建"

# 启动 Docker 并设置开机自启
if systemctl is-active --quiet docker; then
    log "Docker 已运行，重启以应用配置..."
    systemctl restart docker
else
    log "启动 Docker 服务..."
    systemctl start docker
fi

# 等待 Docker 启动完成
log "等待 Docker 服务就绪..."
for i in {1..10}; do
    if systemctl is-active --quiet docker && docker info >/dev/null 2>&1; then
        log "✓ Docker 服务已就绪"
        break
    fi
    sleep 1
done

# 5. 配置用户权限
log "[5/5] 配置用户权限..."
# 将当前用户（如果不是 root）加入 docker 组
if [ -n "$SUDO_USER" ]; then
    usermod -aG docker $SUDO_USER
    log "✓ 用户 $SUDO_USER 已加入 docker 组"
elif [ "$USER" != "root" ]; then
    usermod -aG docker $USER
    log "✓ 用户 $USER 已加入 docker 组"
else
    log "✓ root 用户无需配置 docker 组"
fi

# 验证 Docker 安装
log ""
log "=========================================="
log "验证 Docker 安装..."
log "=========================================="

# 检查 Docker 版本
DOCKER_VERSION=$(docker --version 2>/dev/null || echo "未知")
log "Docker 版本: $DOCKER_VERSION"

# 检查 Docker 服务状态
if systemctl is-active --quiet docker; then
    log "✓ Docker 服务运行正常"
else
    err "Docker 服务未运行"
    exit 1
fi

# 验证 Docker 可用性
if docker info >/dev/null 2>&1; then
    log "✓ Docker 命令可执行"
    log ""
    log "Docker 信息:"
    # 临时关闭 pipefail 以避免 head 导致的错误
    set +o pipefail
    docker info 2>/dev/null | head -20 || true
    set -o pipefail
else
    warn "Docker 命令执行失败，但服务已安装"
fi

# 测试 Docker 运行（完全可选，不影响安装结果）
log ""
log "测试 Docker 运行（可选）..."
if timeout 30 docker run --rm hello-world 2>/dev/null; then
    log "✓ Docker 测试成功"
else
    log "提示：跳过 Docker 运行测试（可能是网络原因或无法访问 Docker Hub，已确认 Docker 服务正常运行）"
    log "提示：如需手动测试，可在网络正常时运行： docker run --rm hello-world"
fi

log ""
log "=========================================="
log "Docker CE 安装完成！"
log "=========================================="
log ""
log "注意：如果当前用户不是 root，请重新登录以使 docker 组权限生效"
log "下一步：运行 scripts/k8s/setup-k8s.sh 安装 Kubernetes"

